package commUtils

import (
	"crypto/md5"
	"encoding/hex"
	"encoding/json"
	"log"
	"os"
	"strings"

	"github.com/google/uuid"
	"github.com/rs/xid"
	"github.com/segmentio/ksuid"
)

func MakeMD5(s string) string {
	m := md5.New()
	m.Write([]byte(s))
	return strings.ToUpper(hex.EncodeToString(m.Sum(nil)))
}

func GenUUID() string {
	return uuid.New().String() //36位无序UUID. 示例: 1aaddde2-99a8-4632-806f-9c315e1e8d77
}
func GenKSUID() string {
	return ksuid.New().String() //20位,有序且唯一(测试并没达到有序). 示例: 2U0ZQNy8SPeVgR7HJHliOTR8s02
}
func GenXID() string {
	return xid.New().String() //12位,唯一,一定程度内有序. 示例: cjdh21dgn978q5350l60
}

// UUIDToInt
// 将 UUID 字符串转为 int,
// 策略是将 UUID 前 8 个 byte 转成 int 取 10 的模，放到 int 的 8 位当中
func UUIDToInt(id string) int {
	var ret int

	u, _ := uuid.Parse(id)

	for i := 0; i < 8; i++ {
		a := int(u[i]) % 10
		ret *= 10
		ret += a
	}

	return ret
}

func Save2JsonFile(v interface{}, path string) error {
	file, err := os.Create(path)
	if err == nil {
		defer file.Close()
		e := json.NewEncoder(file)
		e.Encode(v)
	} else {
		log.Println(err)
	}

	return err
}

func ReadFromJsonFile(path string, v interface{}) error {
	file, err := os.Open(path)
	if err == nil {
		defer file.Close()
		decoder := json.NewDecoder(file)
		decoder.Decode(&v)
	} else {
		log.Println(err)
	}

	return err
}
